package cn.kgc.springmvc.day04.interceptors;

import cn.hutool.json.JSONUtil;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.util.HashMap;

/**
 * @author 课工场
 * @date 2024/11/13
 * @description  用户自定义的拦截器
 *
 *   定义一个类实现 HandlerInterceptor接口
 */
public class CustomerLoginInterceptor  implements HandlerInterceptor {


    //  在请求到达目标接口之前执行    true  放行   false  拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("----------preHandle------------");
        //  用户访问受限资源时  需要先认证    session  authentication
        HttpSession session = request.getSession();
        Object user = session.getAttribute("authentication");


        //  1.获取请求的路径   判定请求是否是非受限资源    login  register   2. 可以在配置文件中直接声明放行的资源

        if (ObjectUtils.isEmpty(user)){   //  没有认证

            /*
            *   请求被拦截后 ,有两种处理方式
            *    1.  通过重定向的方式 将请求重定向到登录页  response
            *    2.  响应json格式的数据给浏览器
            * */

            // 响应json格式的数据给浏览器   code   401   message  没有认证,请认证后访问
            HashMap<String, Object> result = new HashMap<>();
            result.put("code",401);
            result.put("message","没有认证,请认证后访问");

            String jsonStr = JSONUtil.toJsonStr(result);
            response.setContentType("application/json;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write(jsonStr);
            writer.close();
            return  false;
        }

        return true;
    }



}
